使用 Toolbar 组件

Scripting 的工具栏系统不仅支持直接在 toolbar 属性中传入 ToolBarProps 对象,也支持使用与 SwiftUI 结构一致的 <Toolbar><ToolbarItem><ToolbarItemGroup><ToolbarSpacer><DefaultToolbarItem> 等组件,构建更灵活、更强大的导航栏和工具栏布局。

这些组件能够提供更精细的控制,允许开发者像 SwiftUI 一样以声明式方式编排工具栏内容,并为复杂布局提供更高可读性和可维护性。


基本概念

工具栏组件始终通过视图的 toolbar 属性使用:

1<List
2  toolbar={
3    <Toolbar>
4      {/* 工具栏项 */}
5    </Toolbar>
6  }
7>
8  {/* 主内容 */}
9</List>

toolbar 可以接受:

  • ToolBarProps 对象(与原机制一致)
  • VirtualNode(必须为 <Toolbar> 组件)

使用 <Toolbar> 时,所有内容都通过 <ToolbarItem> 系列组件明确定义位置和呈现方式。


Toolbar

Toolbar 组件是工具栏的容器,用于包含多个工具栏项。它本身不定义位置,内部的 ToolbarItemToolbarItemGroup 决定实际布局。

用法示例

1<List
2  toolbar={
3    <Toolbar>
4      <ToolbarItem placement="topBarLeading">
5        <Button title="关闭" action={() => dismiss()} />
6      </ToolbarItem>
7      <ToolbarItem placement="topBarTrailing">
8        <Button title="完成" action={() => handleDone()} />
9      </ToolbarItem>
10    </Toolbar>
11  }
12>
13  {/* 主内容 */}
14</List>

ToolbarItem

ToolbarItem 表示放置在工具栏指定位置的单个项目。

参数说明

参数 类型 默认值 说明
placement ToolbarItemPlacement automatic 指定工具栏位置,如 topBarLeadingnavigationprimaryAction
children VirtualNode 工具栏项的实际内容,例如按钮或文本

示例

1<Toolbar>
2  <ToolbarItem placement="navigation">
3    <Button title="返回" action={() => navigation.pop()} />
4  </ToolbarItem>
5</Toolbar>

ToolbarItemGroup

ToolbarItemGroup 用于在同一位置放置多个工具栏项目,所有子项目将作为一组呈现。

参数说明

参数 类型 默认值 说明
placement ToolbarItemPlacement automatic 工具栏位置
children 多个 VirtualNode 多个工具栏元素

示例

1<Toolbar>
2  <ToolbarItemGroup placement="topBarTrailing">
3    <Button title="刷新" action={reload} />
4    <Button title="更多" action={openMenu} />
5  </ToolbarItemGroup>
6</Toolbar>

ToolbarSpacer

ToolbarSpacer 用于在工具栏项之间添加空白区域,适合需要自定义布局的场景。

参数说明

参数 类型 默认值 说明
sizing 'fixed' | 'flexible' flexible 控制 Spacer 是否固定大小或可伸缩
placement ToolbarItemPlacement automatic Spacer 所在位置

行为说明

  • flexible: 工具栏中的弹性空间,它会占据剩余区域。
  • fixed: 提供固定间隔,适合多个按钮之间进行细微布局。

示例:在同一组中强制按钮分隔

1<Toolbar>
2  <ToolbarItem placement="topBarTrailing">
3    <Button title="Edit" action={edit} />
4  </ToolbarItem>
5  <ToolbarSpacer sizing="fixed" placement="topBarTrailing" />
6  <ToolbarItem placement="topBarTrailing">
7    <Button title="Save" action={save} />
8  </ToolbarItem>
9</Toolbar>

DefaultToolbarItem

1type ToolbarDefaultItemKind = "sidebarToggle" | "search" | "title";
2
3type DefaultToolbarItemProps = {
4  kind: ToolbarDefaultItemKind;
5  placement?: ToolbarItemPlacement;
6};
7
8declare const DefaultToolbarItem: FunctionComponent<DefaultToolbarItemProps>;

用于渲染系统提供的默认工具栏项目,例如侧边栏切换按钮、搜索按钮、标题显示等。

参数说明

参数 类型 默认值 说明
kind "sidebarToggle" | "search" | "title" 选择系统默认项目类型
placement ToolbarItemPlacement automatic 放置位置

示例:添加默认的搜索栏按钮

1<Toolbar>
2  <DefaultToolbarItem kind="search" placement="topBarTrailing" />
3</Toolbar>

综合示例:使用 Toolbar 构建复杂工具栏

1<NavigationStack>
2  <List
3    toolbar={
4      <Toolbar>
5
6        {/* 左侧导航按钮 */}
7        <ToolbarItem placement="navigation">
8          <Button title="返回" action={navigation.pop} />
9        </ToolbarItem>
10
11        {/* 标题 */}
12        <DefaultToolbarItem kind="title" />
13
14        {/* 右侧一组按钮 */}
15        <ToolbarItem placement="topBarTrailing">
16          <Button title="编辑" action={edit} />
17        </ToolbarItem>
18        <ToolbarSpacer sizing="fixed" placement="topBarTrailing" />
19        <ToolbarItem placement="topBarTrailing">
20          <Button title="完成" action={finish} />
21        </ToolbarItem>
22
23        {/* 底部区域按钮 */}
24        <ToolbarItem placement="bottomBar">
25          <Button title="帮助" action={showHelp} />
26        </ToolbarItem>
27
28      </Toolbar>
29    }
30  >
31    {/* 主内容 */}
32  </List>
33</NavigationStack>

此结构灵活而清晰,可复现 SwiftUI 中复杂的工具栏布局。


与 ToolBarProps 的关系

在 API 层面:

方式 说明
toolbar={ { topBarTrailing: <Button/> } } 简洁、直观,适合简单场景
toolbar={<Toolbar>...</Toolbar>} 可组合,可精确布局,适合复杂、多组内容

两种方式完全兼容,可根据需要选择。


总结

Toolbar 组件提供了高度灵活的工具栏布局能力,包括:

  • 单项工具栏项 (ToolbarItem)
  • 工具栏项目组 (ToolbarItemGroup)
  • 自适应空白区域 (ToolbarSpacer)
  • 系统默认工具栏元素 (DefaultToolbarItem)
  • 容器式声明 (<Toolbar>)